Benson Project

WomenTechWomenYes (WTWY) has an annual gala at the beginning of the summer each year. There has been a significant drop in attendance at the last WTWY Gala. This will affect the direction and efficacy of WTWY’s mission statement - that is unacceptable.

We recently obtained NYC MTA data and would like to make a valuable contribution to increasing their overall membership rates.

Our data gives us insight into which stations and days of the week have the most foot-traffic - thus optimizing volunteer placement for outreach. Our analysis even highlights specific turnstiles within a station!

Furthermore, trends by week and time are readily available. Complimentary graphs for viewing pleasure.

Currently, we are in the process of combining census data with our findings to give further insight into the demographics of foot-traffic, that is to say, WTWY's future potential donors and members.


In [56]:
# imports a library 'pandas', names it as 'pd'
import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image

import datetime
from datetime import datetime as dt
import calendar

import pickle
from copy import deepcopy
from collections import defaultdict

# enables inline plots, without it plots don't show up in the notebook
%matplotlib inline
%autosave 120


Autosaving every 120 seconds

In [14]:
print("Pandas version:",pd.__version__)
print("Numpy version:",np.__version__)


Pandas version: 0.20.1
Numpy version: 1.12.1

In [15]:
# various options in pandas
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', 200)
pd.set_option('display.precision', 3)

Obtaining the Data

The gala will be held on May 30th! We wish to give WTWY 2 weeks to in order to implement our findings!

In order to use the latest results, we will be using MTA data that relates to 3 weeks prior to the 2 week implemtation process.

Below we will clean up/standardize the headers in addition to adding useful information to the datframe i.e. turnstile.

We will also pickle our resulting dataframe in order to ensure we can obtain the original information with speed should it be required later on.


In [16]:
MTA_May13 = pd.read_csv('http://web.mta.info/developers/data/nyct/turnstile/turnstile_170513.txt')
MTA_May06 = pd.read_csv('http://web.mta.info/developers/data/nyct/turnstile/turnstile_170506.txt')
MTA_Apr29 = pd.read_csv('http://web.mta.info/developers/data/nyct/turnstile/turnstile_170429.txt')

MTAdata_orig = pd.concat([MTA_Apr29, MTA_May06, MTA_May13], ignore_index = True)

MTAdata_orig.rename(columns=lambda x: x.strip(), inplace=True) #rid of whitespace

In [17]:
pickle.dump(MTAdata_orig, open("data/MTAdata_orig", "wb"))
MTAdata_orig.head(10)


Out[17]:
C/A UNIT SCP STATION LINENAME DIVISION DATE TIME DESC ENTRIES EXITS
0 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 00:00:00 REGULAR 6148025 2082120
1 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 04:00:00 REGULAR 6148080 2082123
2 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 08:00:00 REGULAR 6148101 2082157
3 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 12:00:00 REGULAR 6148224 2082251
4 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 16:00:00 REGULAR 6148524 2082316
5 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 20:00:00 REGULAR 6148910 2082368
6 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 00:00:00 REGULAR 6149116 2082395
7 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 04:00:00 REGULAR 6149149 2082398
8 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 08:00:00 REGULAR 6149178 2082419
9 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 12:00:00 REGULAR 6149307 2082504

In [20]:
MTAdata = pickle.load(open("data/MTAdata_orig", "rb"))

In [21]:
MTAdata['date'] = MTAdata['DATE'].apply(lambda x: dt.strptime(x, '%m/%d/%Y')) #make datetime objects

In [27]:
MTAdata['week_day_num'] = MTAdata['date'].apply(lambda x: x.weekday()) #names of the days of week

In [31]:
MTAdata['week_day_name'] = MTAdata['date'].dt.weekday_name#numeric indicies that relate to day of week

In [28]:
MTAdata['time'] = MTAdata['TIME'].apply(lambda x: dt.strptime(x, '%H:%M:%S').time()) #makes time object

In [29]:
MTAdata['turnstile'] = MTAdata['C/A'] + " "+ MTAdata['SCP'] #identifies unique turnstile

In [30]:
MTAdata.head(10)


Out[30]:
C/A UNIT SCP STATION LINENAME DIVISION DATE TIME DESC ENTRIES EXITS date week_day_num week_day_name time turnstile
0 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 00:00:00 REGULAR 6148025 2082120 2017-04-22 5 Saturday 00:00:00 A002 02-00-00
1 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 04:00:00 REGULAR 6148080 2082123 2017-04-22 5 Saturday 04:00:00 A002 02-00-00
2 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 08:00:00 REGULAR 6148101 2082157 2017-04-22 5 Saturday 08:00:00 A002 02-00-00
3 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 12:00:00 REGULAR 6148224 2082251 2017-04-22 5 Saturday 12:00:00 A002 02-00-00
4 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 16:00:00 REGULAR 6148524 2082316 2017-04-22 5 Saturday 16:00:00 A002 02-00-00
5 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 20:00:00 REGULAR 6148910 2082368 2017-04-22 5 Saturday 20:00:00 A002 02-00-00
6 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 00:00:00 REGULAR 6149116 2082395 2017-04-23 6 Sunday 00:00:00 A002 02-00-00
7 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 04:00:00 REGULAR 6149149 2082398 2017-04-23 6 Sunday 04:00:00 A002 02-00-00
8 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 08:00:00 REGULAR 6149178 2082419 2017-04-23 6 Sunday 08:00:00 A002 02-00-00
9 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 12:00:00 REGULAR 6149307 2082504 2017-04-23 6 Sunday 12:00:00 A002 02-00-00

Interesting observation!

It seems that the entries and exits are accumalted values. Thus, we have to find the differences between subsequent entries at the turnstile level.


In [32]:
#turnstile level for entries
MTAdata['turnstile entries'] = MTAdata.groupby(['turnstile'])['ENTRIES'].transform(lambda x: x.diff())

#turnstile level for exits
MTAdata['turnstile exits'] = MTAdata.groupby(['turnstile'])['EXITS'].transform(lambda x: x.diff())

In [33]:
#the starting point of our differences will have NaN's, lets change those to 0's!
MTAdata['turnstile entries'].fillna(0, inplace=True)
MTAdata['turnstile entries'].fillna(0, inplace=True)

In [38]:
#Some of the entry and exit numbers are negative. We assume they are due to the counter errors from the original data. 
#The rows with negative entry or exit numbers will be removed.
MTAdata = MTAdata[(MTAdata['turnstile entries'] > 0) & (MTAdata['turnstile exits'] > 0)]
MTAdata


Out[38]:
C/A UNIT SCP STATION LINENAME DIVISION DATE TIME DESC ENTRIES EXITS date week_day_num week_day_name time turnstile turnstile entries turnstile exits traffic
1 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 04:00:00 REGULAR 6148080 2082123 2017-04-22 5 Saturday 04:00:00 A002 02-00-00 55.0 3.0 58.0
2 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 08:00:00 REGULAR 6148101 2082157 2017-04-22 5 Saturday 08:00:00 A002 02-00-00 21.0 34.0 55.0
3 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 12:00:00 REGULAR 6148224 2082251 2017-04-22 5 Saturday 12:00:00 A002 02-00-00 123.0 94.0 217.0
4 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 16:00:00 REGULAR 6148524 2082316 2017-04-22 5 Saturday 16:00:00 A002 02-00-00 300.0 65.0 365.0
5 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 20:00:00 REGULAR 6148910 2082368 2017-04-22 5 Saturday 20:00:00 A002 02-00-00 386.0 52.0 438.0
6 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 00:00:00 REGULAR 6149116 2082395 2017-04-23 6 Sunday 00:00:00 A002 02-00-00 206.0 27.0 233.0
7 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 04:00:00 REGULAR 6149149 2082398 2017-04-23 6 Sunday 04:00:00 A002 02-00-00 33.0 3.0 36.0
8 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 08:00:00 REGULAR 6149178 2082419 2017-04-23 6 Sunday 08:00:00 A002 02-00-00 29.0 21.0 50.0
9 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 12:00:00 REGULAR 6149307 2082504 2017-04-23 6 Sunday 12:00:00 A002 02-00-00 129.0 85.0 214.0
10 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 16:00:00 REGULAR 6149514 2082560 2017-04-23 6 Sunday 16:00:00 A002 02-00-00 207.0 56.0 263.0
11 A002 R051 02-00-00 59 ST NQR456W BMT 04/23/2017 20:00:00 REGULAR 6149818 2082604 2017-04-23 6 Sunday 20:00:00 A002 02-00-00 304.0 44.0 348.0
12 A002 R051 02-00-00 59 ST NQR456W BMT 04/24/2017 00:00:00 REGULAR 6149971 2082630 2017-04-24 0 Monday 00:00:00 A002 02-00-00 153.0 26.0 179.0
13 A002 R051 02-00-00 59 ST NQR456W BMT 04/24/2017 04:00:00 REGULAR 6149989 2082631 2017-04-24 0 Monday 04:00:00 A002 02-00-00 18.0 1.0 19.0
14 A002 R051 02-00-00 59 ST NQR456W BMT 04/24/2017 07:09:01 REGULAR 6150007 2082687 2017-04-24 0 Monday 07:09:01 A002 02-00-00 18.0 56.0 74.0
15 A002 R051 02-00-00 59 ST NQR456W BMT 04/24/2017 08:00:00 REGULAR 6150056 2082752 2017-04-24 0 Monday 08:00:00 A002 02-00-00 49.0 65.0 114.0
16 A002 R051 02-00-00 59 ST NQR456W BMT 04/24/2017 12:00:00 REGULAR 6150321 2082986 2017-04-24 0 Monday 12:00:00 A002 02-00-00 265.0 234.0 499.0
17 A002 R051 02-00-00 59 ST NQR456W BMT 04/24/2017 16:00:00 REGULAR 6150769 2083047 2017-04-24 0 Monday 16:00:00 A002 02-00-00 448.0 61.0 509.0
18 A002 R051 02-00-00 59 ST NQR456W BMT 04/24/2017 20:00:00 REGULAR 6151473 2083100 2017-04-24 0 Monday 20:00:00 A002 02-00-00 704.0 53.0 757.0
21 A002 R051 02-00-00 59 ST NQR456W BMT 04/25/2017 08:00:00 REGULAR 6151524 2083240 2017-04-25 1 Tuesday 08:00:00 A002 02-00-00 51.0 112.0 163.0
22 A002 R051 02-00-00 59 ST NQR456W BMT 04/25/2017 12:00:00 REGULAR 6151772 2083511 2017-04-25 1 Tuesday 12:00:00 A002 02-00-00 248.0 271.0 519.0
23 A002 R051 02-00-00 59 ST NQR456W BMT 04/25/2017 16:00:00 REGULAR 6152281 2083580 2017-04-25 1 Tuesday 16:00:00 A002 02-00-00 509.0 69.0 578.0
24 A002 R051 02-00-00 59 ST NQR456W BMT 04/25/2017 20:00:00 REGULAR 6152823 2083668 2017-04-25 1 Tuesday 20:00:00 A002 02-00-00 542.0 88.0 630.0
25 A002 R051 02-00-00 59 ST NQR456W BMT 04/26/2017 00:00:00 REGULAR 6153037 2083698 2017-04-26 2 Wednesday 00:00:00 A002 02-00-00 214.0 30.0 244.0
26 A002 R051 02-00-00 59 ST NQR456W BMT 04/26/2017 04:00:00 REGULAR 6153052 2083703 2017-04-26 2 Wednesday 04:00:00 A002 02-00-00 15.0 5.0 20.0
27 A002 R051 02-00-00 59 ST NQR456W BMT 04/26/2017 08:00:00 REGULAR 6153094 2083802 2017-04-26 2 Wednesday 08:00:00 A002 02-00-00 42.0 99.0 141.0
28 A002 R051 02-00-00 59 ST NQR456W BMT 04/26/2017 12:00:00 REGULAR 6153254 2084053 2017-04-26 2 Wednesday 12:00:00 A002 02-00-00 160.0 251.0 411.0
29 A002 R051 02-00-00 59 ST NQR456W BMT 04/26/2017 16:00:00 REGULAR 6153529 2084119 2017-04-26 2 Wednesday 16:00:00 A002 02-00-00 275.0 66.0 341.0
30 A002 R051 02-00-00 59 ST NQR456W BMT 04/26/2017 20:00:00 REGULAR 6154302 2084195 2017-04-26 2 Wednesday 20:00:00 A002 02-00-00 773.0 76.0 849.0
31 A002 R051 02-00-00 59 ST NQR456W BMT 04/27/2017 00:00:00 REGULAR 6154537 2084226 2017-04-27 3 Thursday 00:00:00 A002 02-00-00 235.0 31.0 266.0
32 A002 R051 02-00-00 59 ST NQR456W BMT 04/27/2017 04:00:00 REGULAR 6154558 2084231 2017-04-27 3 Thursday 04:00:00 A002 02-00-00 21.0 5.0 26.0
33 A002 R051 02-00-00 59 ST NQR456W BMT 04/27/2017 08:00:00 REGULAR 6154609 2084348 2017-04-27 3 Thursday 08:00:00 A002 02-00-00 51.0 117.0 168.0
34 A002 R051 02-00-00 59 ST NQR456W BMT 04/27/2017 12:00:00 REGULAR 6154784 2084551 2017-04-27 3 Thursday 12:00:00 A002 02-00-00 175.0 203.0 378.0
35 A002 R051 02-00-00 59 ST NQR456W BMT 04/27/2017 16:00:00 REGULAR 6155090 2084616 2017-04-27 3 Thursday 16:00:00 A002 02-00-00 306.0 65.0 371.0
36 A002 R051 02-00-00 59 ST NQR456W BMT 04/27/2017 20:00:00 REGULAR 6155892 2084700 2017-04-27 3 Thursday 20:00:00 A002 02-00-00 802.0 84.0 886.0
37 A002 R051 02-00-00 59 ST NQR456W BMT 04/28/2017 00:00:00 REGULAR 6156153 2084732 2017-04-28 4 Friday 00:00:00 A002 02-00-00 261.0 32.0 293.0
38 A002 R051 02-00-00 59 ST NQR456W BMT 04/28/2017 04:00:00 REGULAR 6156186 2084739 2017-04-28 4 Friday 04:00:00 A002 02-00-00 33.0 7.0 40.0
39 A002 R051 02-00-00 59 ST NQR456W BMT 04/28/2017 08:00:00 REGULAR 6156226 2084844 2017-04-28 4 Friday 08:00:00 A002 02-00-00 40.0 105.0 145.0
40 A002 R051 02-00-00 59 ST NQR456W BMT 04/28/2017 12:00:00 REGULAR 6156411 2085130 2017-04-28 4 Friday 12:00:00 A002 02-00-00 185.0 286.0 471.0
41 A002 R051 02-00-00 59 ST NQR456W BMT 04/28/2017 16:00:00 REGULAR 6156706 2085208 2017-04-28 4 Friday 16:00:00 A002 02-00-00 295.0 78.0 373.0
42 A002 R051 02-00-00 59 ST NQR456W BMT 04/28/2017 20:00:00 REGULAR 6157479 2085283 2017-04-28 4 Friday 20:00:00 A002 02-00-00 773.0 75.0 848.0
44 A002 R051 02-00-01 59 ST NQR456W BMT 04/22/2017 04:00:00 REGULAR 5574153 1234002 2017-04-22 5 Saturday 04:00:00 A002 02-00-01 14.0 3.0 17.0
45 A002 R051 02-00-01 59 ST NQR456W BMT 04/22/2017 08:00:00 REGULAR 5574164 1234018 2017-04-22 5 Saturday 08:00:00 A002 02-00-01 11.0 16.0 27.0
46 A002 R051 02-00-01 59 ST NQR456W BMT 04/22/2017 12:00:00 REGULAR 5574245 1234076 2017-04-22 5 Saturday 12:00:00 A002 02-00-01 81.0 58.0 139.0
47 A002 R051 02-00-01 59 ST NQR456W BMT 04/22/2017 16:00:00 REGULAR 5574461 1234122 2017-04-22 5 Saturday 16:00:00 A002 02-00-01 216.0 46.0 262.0
48 A002 R051 02-00-01 59 ST NQR456W BMT 04/22/2017 20:00:00 REGULAR 5574755 1234148 2017-04-22 5 Saturday 20:00:00 A002 02-00-01 294.0 26.0 320.0
49 A002 R051 02-00-01 59 ST NQR456W BMT 04/23/2017 00:00:00 REGULAR 5574851 1234163 2017-04-23 6 Sunday 00:00:00 A002 02-00-01 96.0 15.0 111.0
50 A002 R051 02-00-01 59 ST NQR456W BMT 04/23/2017 04:00:00 REGULAR 5574874 1234164 2017-04-23 6 Sunday 04:00:00 A002 02-00-01 23.0 1.0 24.0
51 A002 R051 02-00-01 59 ST NQR456W BMT 04/23/2017 08:00:00 REGULAR 5574881 1234179 2017-04-23 6 Sunday 08:00:00 A002 02-00-01 7.0 15.0 22.0
52 A002 R051 02-00-01 59 ST NQR456W BMT 04/23/2017 12:00:00 REGULAR 5574887 1234214 2017-04-23 6 Sunday 12:00:00 A002 02-00-01 6.0 35.0 41.0
53 A002 R051 02-00-01 59 ST NQR456W BMT 04/23/2017 16:00:00 REGULAR 5575051 1234238 2017-04-23 6 Sunday 16:00:00 A002 02-00-01 164.0 24.0 188.0
54 A002 R051 02-00-01 59 ST NQR456W BMT 04/23/2017 20:00:00 REGULAR 5575280 1234266 2017-04-23 6 Sunday 20:00:00 A002 02-00-01 229.0 28.0 257.0
55 A002 R051 02-00-01 59 ST NQR456W BMT 04/24/2017 00:00:00 REGULAR 5575379 1234286 2017-04-24 0 Monday 00:00:00 A002 02-00-01 99.0 20.0 119.0
57 A002 R051 02-00-01 59 ST NQR456W BMT 04/24/2017 07:09:01 REGULAR 5575395 1234305 2017-04-24 0 Monday 07:09:01 A002 02-00-01 11.0 19.0 30.0
61 A002 R051 02-00-01 59 ST NQR456W BMT 04/24/2017 20:00:00 REGULAR 5575853 1234570 2017-04-24 0 Monday 20:00:00 A002 02-00-01 458.0 57.0 515.0
62 A002 R051 02-00-01 59 ST NQR456W BMT 04/25/2017 00:00:00 REGULAR 5576071 1234589 2017-04-25 1 Tuesday 00:00:00 A002 02-00-01 218.0 19.0 237.0
63 A002 R051 02-00-01 59 ST NQR456W BMT 04/25/2017 04:00:00 REGULAR 5576082 1234591 2017-04-25 1 Tuesday 04:00:00 A002 02-00-01 11.0 2.0 13.0
67 A002 R051 02-00-01 59 ST NQR456W BMT 04/25/2017 20:00:00 REGULAR 5576552 1234970 2017-04-25 1 Tuesday 20:00:00 A002 02-00-01 470.0 111.0 581.0
68 A002 R051 02-00-01 59 ST NQR456W BMT 04/26/2017 00:00:00 REGULAR 5576648 1234996 2017-04-26 2 Wednesday 00:00:00 A002 02-00-01 96.0 26.0 122.0
69 A002 R051 02-00-01 59 ST NQR456W BMT 04/26/2017 04:00:00 REGULAR 5576657 1235001 2017-04-26 2 Wednesday 04:00:00 A002 02-00-01 9.0 5.0 14.0
70 A002 R051 02-00-01 59 ST NQR456W BMT 04/26/2017 08:00:00 REGULAR 5576681 1235050 2017-04-26 2 Wednesday 08:00:00 A002 02-00-01 24.0 49.0 73.0
71 A002 R051 02-00-01 59 ST NQR456W BMT 04/26/2017 12:00:00 REGULAR 5576836 1235180 2017-04-26 2 Wednesday 12:00:00 A002 02-00-01 155.0 130.0 285.0
72 A002 R051 02-00-01 59 ST NQR456W BMT 04/26/2017 16:00:00 REGULAR 5577100 1235245 2017-04-26 2 Wednesday 16:00:00 A002 02-00-01 264.0 65.0 329.0
73 A002 R051 02-00-01 59 ST NQR456W BMT 04/26/2017 20:00:00 REGULAR 5577711 1235309 2017-04-26 2 Wednesday 20:00:00 A002 02-00-01 611.0 64.0 675.0
74 A002 R051 02-00-01 59 ST NQR456W BMT 04/27/2017 00:00:00 REGULAR 5577861 1235326 2017-04-27 3 Thursday 00:00:00 A002 02-00-01 150.0 17.0 167.0
75 A002 R051 02-00-01 59 ST NQR456W BMT 04/27/2017 04:00:00 REGULAR 5577874 1235332 2017-04-27 3 Thursday 04:00:00 A002 02-00-01 13.0 6.0 19.0
76 A002 R051 02-00-01 59 ST NQR456W BMT 04/27/2017 08:00:00 REGULAR 5577904 1235380 2017-04-27 3 Thursday 08:00:00 A002 02-00-01 30.0 48.0 78.0
77 A002 R051 02-00-01 59 ST NQR456W BMT 04/27/2017 12:00:00 REGULAR 5578040 1235464 2017-04-27 3 Thursday 12:00:00 A002 02-00-01 136.0 84.0 220.0
78 A002 R051 02-00-01 59 ST NQR456W BMT 04/27/2017 16:00:00 REGULAR 5578279 1235511 2017-04-27 3 Thursday 16:00:00 A002 02-00-01 239.0 47.0 286.0
79 A002 R051 02-00-01 59 ST NQR456W BMT 04/27/2017 20:00:00 REGULAR 5578877 1235569 2017-04-27 3 Thursday 20:00:00 A002 02-00-01 598.0 58.0 656.0
80 A002 R051 02-00-01 59 ST NQR456W BMT 04/28/2017 00:00:00 REGULAR 5579067 1235592 2017-04-28 4 Friday 00:00:00 A002 02-00-01 190.0 23.0 213.0
81 A002 R051 02-00-01 59 ST NQR456W BMT 04/28/2017 04:00:00 REGULAR 5579082 1235595 2017-04-28 4 Friday 04:00:00 A002 02-00-01 15.0 3.0 18.0
82 A002 R051 02-00-01 59 ST NQR456W BMT 04/28/2017 08:00:00 REGULAR 5579104 1235645 2017-04-28 4 Friday 08:00:00 A002 02-00-01 22.0 50.0 72.0
83 A002 R051 02-00-01 59 ST NQR456W BMT 04/28/2017 12:00:00 REGULAR 5579265 1235784 2017-04-28 4 Friday 12:00:00 A002 02-00-01 161.0 139.0 300.0
84 A002 R051 02-00-01 59 ST NQR456W BMT 04/28/2017 16:00:00 REGULAR 5579545 1235827 2017-04-28 4 Friday 16:00:00 A002 02-00-01 280.0 43.0 323.0
85 A002 R051 02-00-01 59 ST NQR456W BMT 04/28/2017 20:00:00 REGULAR 5580208 1235885 2017-04-28 4 Friday 20:00:00 A002 02-00-01 663.0 58.0 721.0
87 A002 R051 02-03-00 59 ST NQR456W BMT 04/22/2017 04:00:00 REGULAR 900569 3343227 2017-04-22 5 Saturday 04:00:00 A002 02-03-00 20.0 24.0 44.0
88 A002 R051 02-03-00 59 ST NQR456W BMT 04/22/2017 08:00:00 REGULAR 900573 3343349 2017-04-22 5 Saturday 08:00:00 A002 02-03-00 4.0 122.0 126.0
89 A002 R051 02-03-00 59 ST NQR456W BMT 04/22/2017 12:00:00 REGULAR 900616 3343746 2017-04-22 5 Saturday 12:00:00 A002 02-03-00 43.0 397.0 440.0
90 A002 R051 02-03-00 59 ST NQR456W BMT 04/22/2017 16:00:00 REGULAR 900755 3344166 2017-04-22 5 Saturday 16:00:00 A002 02-03-00 139.0 420.0 559.0
91 A002 R051 02-03-00 59 ST NQR456W BMT 04/22/2017 20:00:00 REGULAR 900914 3344586 2017-04-22 5 Saturday 20:00:00 A002 02-03-00 159.0 420.0 579.0
92 A002 R051 02-03-00 59 ST NQR456W BMT 04/23/2017 00:00:00 REGULAR 901002 3344774 2017-04-23 6 Sunday 00:00:00 A002 02-03-00 88.0 188.0 276.0
93 A002 R051 02-03-00 59 ST NQR456W BMT 04/23/2017 04:00:00 REGULAR 901010 3344793 2017-04-23 6 Sunday 04:00:00 A002 02-03-00 8.0 19.0 27.0
94 A002 R051 02-03-00 59 ST NQR456W BMT 04/23/2017 08:00:00 REGULAR 901013 3344860 2017-04-23 6 Sunday 08:00:00 A002 02-03-00 3.0 67.0 70.0
95 A002 R051 02-03-00 59 ST NQR456W BMT 04/23/2017 12:00:00 REGULAR 901049 3345111 2017-04-23 6 Sunday 12:00:00 A002 02-03-00 36.0 251.0 287.0
96 A002 R051 02-03-00 59 ST NQR456W BMT 04/23/2017 16:00:00 REGULAR 901124 3345493 2017-04-23 6 Sunday 16:00:00 A002 02-03-00 75.0 382.0 457.0
97 A002 R051 02-03-00 59 ST NQR456W BMT 04/23/2017 20:00:00 REGULAR 901206 3345834 2017-04-23 6 Sunday 20:00:00 A002 02-03-00 82.0 341.0 423.0
98 A002 R051 02-03-00 59 ST NQR456W BMT 04/24/2017 00:00:00 REGULAR 901286 3345945 2017-04-24 0 Monday 00:00:00 A002 02-03-00 80.0 111.0 191.0
99 A002 R051 02-03-00 59 ST NQR456W BMT 04/24/2017 04:00:00 REGULAR 901289 3345956 2017-04-24 0 Monday 04:00:00 A002 02-03-00 3.0 11.0 14.0
100 A002 R051 02-03-00 59 ST NQR456W BMT 04/24/2017 07:09:01 REGULAR 901294 3346080 2017-04-24 0 Monday 07:09:01 A002 02-03-00 5.0 124.0 129.0
101 A002 R051 02-03-00 59 ST NQR456W BMT 04/24/2017 08:00:00 REGULAR 901297 3346258 2017-04-24 0 Monday 08:00:00 A002 02-03-00 3.0 178.0 181.0
102 A002 R051 02-03-00 59 ST NQR456W BMT 04/24/2017 12:00:00 REGULAR 901350 3347077 2017-04-24 0 Monday 12:00:00 A002 02-03-00 53.0 819.0 872.0
103 A002 R051 02-03-00 59 ST NQR456W BMT 04/24/2017 16:00:00 REGULAR 901509 3347374 2017-04-24 0 Monday 16:00:00 A002 02-03-00 159.0 297.0 456.0
104 A002 R051 02-03-00 59 ST NQR456W BMT 04/24/2017 20:00:00 REGULAR 901783 3348026 2017-04-24 0 Monday 20:00:00 A002 02-03-00 274.0 652.0 926.0
105 A002 R051 02-03-00 59 ST NQR456W BMT 04/25/2017 00:00:00 REGULAR 901892 3348156 2017-04-25 1 Tuesday 00:00:00 A002 02-03-00 109.0 130.0 239.0
106 A002 R051 02-03-00 59 ST NQR456W BMT 04/25/2017 04:00:00 REGULAR 901905 3348168 2017-04-25 1 Tuesday 04:00:00 A002 02-03-00 13.0 12.0 25.0
107 A002 R051 02-03-00 59 ST NQR456W BMT 04/25/2017 08:00:00 REGULAR 901924 3348471 2017-04-25 1 Tuesday 08:00:00 A002 02-03-00 19.0 303.0 322.0
108 A002 R051 02-03-00 59 ST NQR456W BMT 04/25/2017 12:00:00 REGULAR 901993 3349322 2017-04-25 1 Tuesday 12:00:00 A002 02-03-00 69.0 851.0 920.0
109 A002 R051 02-03-00 59 ST NQR456W BMT 04/25/2017 16:00:00 REGULAR 902080 3349673 2017-04-25 1 Tuesday 16:00:00 A002 02-03-00 87.0 351.0 438.0
110 A002 R051 02-03-00 59 ST NQR456W BMT 04/25/2017 20:00:00 REGULAR 902634 3350309 2017-04-25 1 Tuesday 20:00:00 A002 02-03-00 554.0 636.0 1190.0
111 A002 R051 02-03-00 59 ST NQR456W BMT 04/26/2017 00:00:00 REGULAR 902724 3350472 2017-04-26 2 Wednesday 00:00:00 A002 02-03-00 90.0 163.0 253.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
592189 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/07/2017 09:00:00 REGULAR 2184321 23380 2017-05-07 6 Sunday 09:00:00 TRAM2 00-00-01 68.0 2.0 70.0
592190 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/07/2017 13:00:00 REGULAR 2184712 23382 2017-05-07 6 Sunday 13:00:00 TRAM2 00-00-01 391.0 2.0 393.0
592191 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/07/2017 17:00:00 REGULAR 2185167 23385 2017-05-07 6 Sunday 17:00:00 TRAM2 00-00-01 455.0 3.0 458.0
592192 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/07/2017 21:00:00 REGULAR 2185470 23388 2017-05-07 6 Sunday 21:00:00 TRAM2 00-00-01 303.0 3.0 306.0
592193 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/08/2017 01:00:00 REGULAR 2185545 23391 2017-05-08 0 Monday 01:00:00 TRAM2 00-00-01 75.0 3.0 78.0
592195 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/08/2017 09:00:00 REGULAR 2186005 23396 2017-05-08 0 Monday 09:00:00 TRAM2 00-00-01 460.0 5.0 465.0
592197 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/08/2017 13:00:00 REGULAR 2186462 23398 2017-05-08 0 Monday 13:00:00 TRAM2 00-00-01 186.0 2.0 188.0
592198 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/08/2017 17:00:00 REGULAR 2186751 23400 2017-05-08 0 Monday 17:00:00 TRAM2 00-00-01 289.0 2.0 291.0
592199 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/08/2017 17:45:33 REGULAR 2186829 23401 2017-05-08 0 Monday 17:45:33 TRAM2 00-00-01 78.0 1.0 79.0
592200 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/08/2017 21:00:00 REGULAR 2187046 23402 2017-05-08 0 Monday 21:00:00 TRAM2 00-00-01 217.0 1.0 218.0
592201 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/09/2017 01:00:00 REGULAR 2187097 23403 2017-05-09 1 Tuesday 01:00:00 TRAM2 00-00-01 51.0 1.0 52.0
592203 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/09/2017 08:01:01 REGULAR 2187363 23406 2017-05-09 1 Tuesday 08:01:01 TRAM2 00-00-01 266.0 3.0 269.0
592204 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/09/2017 08:58:36 REGULAR 2187621 23408 2017-05-09 1 Tuesday 08:58:36 TRAM2 00-00-01 258.0 2.0 260.0
592206 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/09/2017 13:00:00 REGULAR 2188142 23410 2017-05-09 1 Tuesday 13:00:00 TRAM2 00-00-01 513.0 2.0 515.0
592207 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/09/2017 17:00:00 REGULAR 2188438 23420 2017-05-09 1 Tuesday 17:00:00 TRAM2 00-00-01 296.0 10.0 306.0
592208 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/09/2017 21:00:00 REGULAR 2188627 23425 2017-05-09 1 Tuesday 21:00:00 TRAM2 00-00-01 189.0 5.0 194.0
592209 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/10/2017 01:00:00 REGULAR 2188687 23427 2017-05-10 2 Wednesday 01:00:00 TRAM2 00-00-01 60.0 2.0 62.0
592211 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/10/2017 09:00:00 REGULAR 2189198 23431 2017-05-10 2 Wednesday 09:00:00 TRAM2 00-00-01 511.0 2.0 513.0
592212 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/10/2017 13:00:00 REGULAR 2189641 23434 2017-05-10 2 Wednesday 13:00:00 TRAM2 00-00-01 443.0 3.0 446.0
592213 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/10/2017 17:00:00 REGULAR 2189930 23436 2017-05-10 2 Wednesday 17:00:00 TRAM2 00-00-01 289.0 2.0 291.0
592214 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/10/2017 21:00:00 REGULAR 2190172 23442 2017-05-10 2 Wednesday 21:00:00 TRAM2 00-00-01 242.0 6.0 248.0
592215 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/11/2017 01:00:00 REGULAR 2190218 23443 2017-05-11 3 Thursday 01:00:00 TRAM2 00-00-01 46.0 1.0 47.0
592216 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/11/2017 05:00:00 REGULAR 2190219 23444 2017-05-11 3 Thursday 05:00:00 TRAM2 00-00-01 1.0 1.0 2.0
592217 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/11/2017 09:00:00 REGULAR 2190730 23445 2017-05-11 3 Thursday 09:00:00 TRAM2 00-00-01 511.0 1.0 512.0
592219 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/11/2017 17:00:00 REGULAR 2191423 23450 2017-05-11 3 Thursday 17:00:00 TRAM2 00-00-01 273.0 5.0 278.0
592220 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/11/2017 21:00:00 REGULAR 2191641 23456 2017-05-11 3 Thursday 21:00:00 TRAM2 00-00-01 218.0 6.0 224.0
592221 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/12/2017 01:00:00 REGULAR 2191695 23461 2017-05-12 4 Friday 01:00:00 TRAM2 00-00-01 54.0 5.0 59.0
592222 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/12/2017 05:00:00 REGULAR 2191696 23462 2017-05-12 4 Friday 05:00:00 TRAM2 00-00-01 1.0 1.0 2.0
592223 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/12/2017 09:00:00 REGULAR 2192188 23463 2017-05-12 4 Friday 09:00:00 TRAM2 00-00-01 492.0 1.0 493.0
592224 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/12/2017 13:00:00 REGULAR 2192660 23467 2017-05-12 4 Friday 13:00:00 TRAM2 00-00-01 472.0 4.0 476.0
592225 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/12/2017 17:00:00 REGULAR 2192976 23478 2017-05-12 4 Friday 17:00:00 TRAM2 00-00-01 316.0 11.0 327.0
592226 TRAM2 R469 00-00-01 RIT-ROOSEVELT R RIT 05/12/2017 21:00:00 REGULAR 2193244 23480 2017-05-12 4 Friday 21:00:00 TRAM2 00-00-01 268.0 2.0 270.0
592229 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/06/2017 09:00:00 REGULAR 406590 16359 2017-05-06 5 Saturday 09:00:00 TRAM2 00-03-00 2.0 3.0 5.0
592230 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/06/2017 13:00:00 REGULAR 406651 16360 2017-05-06 5 Saturday 13:00:00 TRAM2 00-03-00 61.0 1.0 62.0
592231 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/06/2017 17:00:00 REGULAR 406811 16364 2017-05-06 5 Saturday 17:00:00 TRAM2 00-03-00 160.0 4.0 164.0
592232 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/06/2017 21:00:00 REGULAR 406934 16375 2017-05-06 5 Saturday 21:00:00 TRAM2 00-03-00 123.0 11.0 134.0
592233 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/07/2017 01:00:00 REGULAR 406950 16376 2017-05-07 6 Sunday 01:00:00 TRAM2 00-03-00 16.0 1.0 17.0
592234 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/07/2017 05:00:00 REGULAR 406952 16377 2017-05-07 6 Sunday 05:00:00 TRAM2 00-03-00 2.0 1.0 3.0
592235 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/07/2017 09:00:00 REGULAR 406953 16379 2017-05-07 6 Sunday 09:00:00 TRAM2 00-03-00 1.0 2.0 3.0
592236 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/07/2017 13:00:00 REGULAR 407040 16387 2017-05-07 6 Sunday 13:00:00 TRAM2 00-03-00 87.0 8.0 95.0
592237 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/07/2017 17:00:00 REGULAR 407155 16388 2017-05-07 6 Sunday 17:00:00 TRAM2 00-03-00 115.0 1.0 116.0
592238 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/07/2017 21:00:00 REGULAR 407243 16389 2017-05-07 6 Sunday 21:00:00 TRAM2 00-03-00 88.0 1.0 89.0
592241 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/08/2017 09:00:00 REGULAR 407270 16394 2017-05-08 0 Monday 09:00:00 TRAM2 00-03-00 16.0 2.0 18.0
592244 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/08/2017 17:00:00 REGULAR 407424 16398 2017-05-08 0 Monday 17:00:00 TRAM2 00-03-00 83.0 4.0 87.0
592245 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/08/2017 17:45:33 REGULAR 407445 16402 2017-05-08 0 Monday 17:45:33 TRAM2 00-03-00 21.0 4.0 25.0
592246 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/08/2017 21:00:00 REGULAR 407511 16403 2017-05-08 0 Monday 21:00:00 TRAM2 00-03-00 66.0 1.0 67.0
592247 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/09/2017 01:00:00 REGULAR 407527 16406 2017-05-09 1 Tuesday 01:00:00 TRAM2 00-03-00 16.0 3.0 19.0
592249 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/09/2017 08:01:01 REGULAR 407534 16410 2017-05-09 1 Tuesday 08:01:01 TRAM2 00-03-00 7.0 1.0 8.0
592250 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/09/2017 08:58:36 REGULAR 407549 16412 2017-05-09 1 Tuesday 08:58:36 TRAM2 00-03-00 15.0 2.0 17.0
592252 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/09/2017 13:00:00 REGULAR 407609 16413 2017-05-09 1 Tuesday 13:00:00 TRAM2 00-03-00 60.0 1.0 61.0
592253 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/09/2017 17:00:00 REGULAR 407686 16417 2017-05-09 1 Tuesday 17:00:00 TRAM2 00-03-00 77.0 4.0 81.0
592254 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/09/2017 21:00:00 REGULAR 407761 16422 2017-05-09 1 Tuesday 21:00:00 TRAM2 00-03-00 75.0 5.0 80.0
592255 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/10/2017 01:00:00 REGULAR 407777 16423 2017-05-10 2 Wednesday 01:00:00 TRAM2 00-03-00 16.0 1.0 17.0
592256 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/10/2017 05:00:00 REGULAR 407781 16424 2017-05-10 2 Wednesday 05:00:00 TRAM2 00-03-00 4.0 1.0 5.0
592257 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/10/2017 09:00:00 REGULAR 407790 16425 2017-05-10 2 Wednesday 09:00:00 TRAM2 00-03-00 9.0 1.0 10.0
592258 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/10/2017 13:00:00 REGULAR 407843 16426 2017-05-10 2 Wednesday 13:00:00 TRAM2 00-03-00 53.0 1.0 54.0
592260 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/10/2017 21:00:00 REGULAR 408017 16430 2017-05-10 2 Wednesday 21:00:00 TRAM2 00-03-00 93.0 4.0 97.0
592261 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/11/2017 01:00:00 REGULAR 408031 16432 2017-05-11 3 Thursday 01:00:00 TRAM2 00-03-00 14.0 2.0 16.0
592263 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/11/2017 09:00:00 REGULAR 408050 16435 2017-05-11 3 Thursday 09:00:00 TRAM2 00-03-00 19.0 1.0 20.0
592264 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/11/2017 13:00:00 REGULAR 408117 16437 2017-05-11 3 Thursday 13:00:00 TRAM2 00-03-00 67.0 2.0 69.0
592267 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/12/2017 01:00:00 REGULAR 408341 16440 2017-05-12 4 Friday 01:00:00 TRAM2 00-03-00 12.0 3.0 15.0
592270 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/12/2017 13:00:00 REGULAR 408429 16444 2017-05-12 4 Friday 13:00:00 TRAM2 00-03-00 74.0 4.0 78.0
592271 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/12/2017 17:00:00 REGULAR 408558 16446 2017-05-12 4 Friday 17:00:00 TRAM2 00-03-00 129.0 2.0 131.0
592272 TRAM2 R469 00-03-00 RIT-ROOSEVELT R RIT 05/12/2017 21:00:00 REGULAR 408639 16447 2017-05-12 4 Friday 21:00:00 TRAM2 00-03-00 81.0 1.0 82.0
592273 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/06/2017 01:00:00 REGULAR 2741458 381709 2017-05-06 5 Saturday 01:00:00 TRAM2 00-03-01 9.0 1.0 10.0
592275 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/06/2017 09:00:00 REGULAR 2741467 381710 2017-05-06 5 Saturday 09:00:00 TRAM2 00-03-01 6.0 1.0 7.0
592276 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/06/2017 13:00:00 REGULAR 2741536 381714 2017-05-06 5 Saturday 13:00:00 TRAM2 00-03-01 69.0 4.0 73.0
592277 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/06/2017 17:00:00 REGULAR 2741703 381726 2017-05-06 5 Saturday 17:00:00 TRAM2 00-03-01 167.0 12.0 179.0
592278 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/06/2017 21:00:00 REGULAR 2741825 381729 2017-05-06 5 Saturday 21:00:00 TRAM2 00-03-01 122.0 3.0 125.0
592279 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/07/2017 01:00:00 REGULAR 2741863 381731 2017-05-07 6 Sunday 01:00:00 TRAM2 00-03-01 38.0 2.0 40.0
592281 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/07/2017 09:00:00 REGULAR 2741872 381735 2017-05-07 6 Sunday 09:00:00 TRAM2 00-03-01 8.0 4.0 12.0
592282 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/07/2017 13:00:00 REGULAR 2741953 381739 2017-05-07 6 Sunday 13:00:00 TRAM2 00-03-01 81.0 4.0 85.0
592283 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/07/2017 17:00:00 REGULAR 2742064 381743 2017-05-07 6 Sunday 17:00:00 TRAM2 00-03-01 111.0 4.0 115.0
592284 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/07/2017 21:00:00 REGULAR 2742164 381745 2017-05-07 6 Sunday 21:00:00 TRAM2 00-03-01 100.0 2.0 102.0
592285 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/08/2017 01:00:00 REGULAR 2742178 381749 2017-05-08 0 Monday 01:00:00 TRAM2 00-03-01 14.0 4.0 18.0
592287 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/08/2017 09:00:00 REGULAR 2742206 381751 2017-05-08 0 Monday 09:00:00 TRAM2 00-03-01 28.0 1.0 29.0
592288 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/08/2017 10:59:14 REGULAR 2742245 381752 2017-05-08 0 Monday 10:59:14 TRAM2 00-03-01 39.0 1.0 40.0
592289 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/08/2017 13:00:00 REGULAR 2742286 381754 2017-05-08 0 Monday 13:00:00 TRAM2 00-03-01 41.0 2.0 43.0
592290 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/08/2017 17:00:00 REGULAR 2742375 381760 2017-05-08 0 Monday 17:00:00 TRAM2 00-03-01 89.0 6.0 95.0
592291 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/08/2017 17:45:33 REGULAR 2742405 381761 2017-05-08 0 Monday 17:45:33 TRAM2 00-03-01 30.0 1.0 31.0
592292 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/08/2017 21:00:00 REGULAR 2742479 381765 2017-05-08 0 Monday 21:00:00 TRAM2 00-03-01 74.0 4.0 78.0
592293 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/09/2017 01:00:00 REGULAR 2742496 381766 2017-05-09 1 Tuesday 01:00:00 TRAM2 00-03-01 17.0 1.0 18.0
592295 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/09/2017 08:01:01 REGULAR 2742504 381769 2017-05-09 1 Tuesday 08:01:01 TRAM2 00-03-01 8.0 3.0 11.0
592296 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/09/2017 08:58:36 REGULAR 2742517 381770 2017-05-09 1 Tuesday 08:58:36 TRAM2 00-03-01 13.0 1.0 14.0
592298 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/09/2017 13:00:00 REGULAR 2742577 381775 2017-05-09 1 Tuesday 13:00:00 TRAM2 00-03-01 60.0 5.0 65.0
592299 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/09/2017 17:00:00 REGULAR 2742678 381776 2017-05-09 1 Tuesday 17:00:00 TRAM2 00-03-01 101.0 1.0 102.0
592300 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/09/2017 21:00:00 REGULAR 2742753 381781 2017-05-09 1 Tuesday 21:00:00 TRAM2 00-03-01 75.0 5.0 80.0
592301 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/10/2017 01:00:00 REGULAR 2742772 381783 2017-05-10 2 Wednesday 01:00:00 TRAM2 00-03-01 19.0 2.0 21.0
592304 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/10/2017 13:00:00 REGULAR 2742844 381789 2017-05-10 2 Wednesday 13:00:00 TRAM2 00-03-01 55.0 6.0 61.0
592305 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/10/2017 17:00:00 REGULAR 2742918 381790 2017-05-10 2 Wednesday 17:00:00 TRAM2 00-03-01 74.0 1.0 75.0
592309 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/11/2017 09:00:00 REGULAR 2743043 381792 2017-05-11 3 Thursday 09:00:00 TRAM2 00-03-01 9.0 2.0 11.0
592310 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/11/2017 13:00:00 REGULAR 2743109 381793 2017-05-11 3 Thursday 13:00:00 TRAM2 00-03-01 66.0 1.0 67.0
592311 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/11/2017 17:00:00 REGULAR 2743209 381798 2017-05-11 3 Thursday 17:00:00 TRAM2 00-03-01 100.0 5.0 105.0
592312 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/11/2017 21:00:00 REGULAR 2743298 381799 2017-05-11 3 Thursday 21:00:00 TRAM2 00-03-01 89.0 1.0 90.0
592313 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/12/2017 01:00:00 REGULAR 2743317 381800 2017-05-12 4 Friday 01:00:00 TRAM2 00-03-01 19.0 1.0 20.0
592314 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/12/2017 05:00:00 REGULAR 2743318 381801 2017-05-12 4 Friday 05:00:00 TRAM2 00-03-01 1.0 1.0 2.0
592315 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/12/2017 09:00:00 REGULAR 2743328 381804 2017-05-12 4 Friday 09:00:00 TRAM2 00-03-01 10.0 3.0 13.0
592316 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/12/2017 13:00:00 REGULAR 2743422 381809 2017-05-12 4 Friday 13:00:00 TRAM2 00-03-01 94.0 5.0 99.0
592317 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/12/2017 17:00:00 REGULAR 2743554 381812 2017-05-12 4 Friday 17:00:00 TRAM2 00-03-01 132.0 3.0 135.0
592318 TRAM2 R469 00-03-01 RIT-ROOSEVELT R RIT 05/12/2017 21:00:00 REGULAR 2743640 381814 2017-05-12 4 Friday 21:00:00 TRAM2 00-03-01 86.0 2.0 88.0

481572 rows × 19 columns


In [37]:
#the total traffic at a turnstile in a given block of time (4hrs) is the sum of entries and exits.
MTAdata['traffic'] = MTAdata['turnstile entries'] + MTAdata['turnstile exits']


/anaconda/lib/python3.6/site-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  

In [39]:
#since our analysis is at the turnstile level, we assume an upper bound of 5000 individuals through a turnstile
#in a block of time.
MTAdata = MTAdata[MTAdata['traffic'] <= 5000]

In [40]:
#Save MTA dataframe locally.
pickle.dump(MTAdata, open("data/MTAdata_clean", "wb"))

In [41]:
#Load clean MTA dataframe.
MTAdata = pickle.load(open("data/MTAdata_clean", "rb"))

In [42]:
MTAdata.head()


Out[42]:
C/A UNIT SCP STATION LINENAME DIVISION DATE TIME DESC ENTRIES EXITS date week_day_num week_day_name time turnstile turnstile entries turnstile exits traffic
1 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 04:00:00 REGULAR 6148080 2082123 2017-04-22 5 Saturday 04:00:00 A002 02-00-00 55.0 3.0 58.0
2 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 08:00:00 REGULAR 6148101 2082157 2017-04-22 5 Saturday 08:00:00 A002 02-00-00 21.0 34.0 55.0
3 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 12:00:00 REGULAR 6148224 2082251 2017-04-22 5 Saturday 12:00:00 A002 02-00-00 123.0 94.0 217.0
4 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 16:00:00 REGULAR 6148524 2082316 2017-04-22 5 Saturday 16:00:00 A002 02-00-00 300.0 65.0 365.0
5 A002 R051 02-00-00 59 ST NQR456W BMT 04/22/2017 20:00:00 REGULAR 6148910 2082368 2017-04-22 5 Saturday 20:00:00 A002 02-00-00 386.0 52.0 438.0

In [43]:
average_traffic_per_day = int((sum(MTAdata['traffic'])/3)/7)
print("Average Traffic through turnstiles per day: ", average_traffic_per_day)


Average Traffic through turnstiles per day:  9090372

From NYC MTA we obtain the following top 5 stations in the city. Get traffic data for each turnstile at each day of the week.


In [44]:
#Get the total traffic data for each day of the week.
day_total_traffic = pd.DataFrame(MTAdata.groupby(['week_day_name', 'week_day_num'])['traffic'].sum()).reset_index()

In [45]:
#Get the average traffic data for each day of the week.
day_average_traffic = deepcopy(day_total_traffic)
day_average_traffic['traffic'] = day_average_traffic['traffic'] / 3
day_average_traffic = day_average_traffic.sort_values('week_day_num')

In [50]:
#plot the Average Daily Traffic on Day of Week
fig, ax = plt.subplots()
fig.set_size_inches(10,6)
rc={'axes.labelsize': 16, 'font.size': 16, 'legend.fontsize': 32.0, 'axes.titlesize': 24, 'xtick.labelsize': 16, 'ytick.labelsize': 16}
sns.set(rc = rc)
sns.barplot(x = day_average_traffic['week_day_name'], y = day_average_traffic['traffic'])
ax.set_xlabel('Day of Week')
ax.set_ylabel('Total Turnstile Traffic');
#fig.savefig("images/Traffic on Day of Week for NYC MTA System.png")



In [51]:
#Get the average daily traffic data for each station based on weekday traffic.
station_day_total_traffic = pd.DataFrame(MTAdata.groupby(['STATION'])['traffic'].sum()).reset_index()
station_day_average_traffic = deepcopy(station_day_total_traffic)
station_day_average_traffic['traffic'] = station_day_total_traffic['traffic'] / 21
station_day_average_traffic.head(5)


Out[51]:
STATION traffic
0 1 AV 39624.714
1 103 ST 47577.476
2 103 ST-CORONA 31431.333
3 104 ST 2986.619
4 110 ST 19800.714

In [52]:
#plot the average daily traffic data for top stations based on weekday traffic
top_5_list = [('TIMES SQ-42 ST'), ('GRD CNTRL-42 ST'), ('34 ST-HERALD SQ'), ('14 ST-UNION SQ'), ('34 ST-PENN STA')]
top_station_day_average_traffic = station_day_average_traffic[station_day_average_traffic['STATION'].isin(top_5_list)].sort_values('traffic', ascending = False)
print(top_station_day_average_traffic)
fig, ax = plt.subplots()
fig.set_size_inches(8,6)
rc={'axes.labelsize': 16, 'font.size': 16, 'legend.fontsize': 32.0, 'axes.titlesize': 24, 'xtick.labelsize': 16, 'ytick.labelsize': 16}
sns.set(rc = rc)
stagraph = sns.barplot(x = top_station_day_average_traffic['STATION'] , y = top_station_day_average_traffic['traffic'])
for item in stagraph.get_xticklabels():
    item.set_rotation(60)
ax.set_xlabel('Station')
ax.set_ylabel('Daily Traffic');
#ax.set_title('Traffic on Day of Week for NYC MTA System')
#fig.savefig("images/Daily Traffic for Top Stations.png")


             STATION     traffic
61    34 ST-PENN STA  266657.095
232  GRD CNTRL-42 ST  230415.571
59   34 ST-HERALD SQ  198296.238
14    14 ST-UNION SQ  179309.524
349   TIMES SQ-42 ST  168519.810

In [53]:
def time_bin(x):
    if x < datetime.time(2):
        return "00:00-01:59"
    elif x < datetime.time(6):
        return "02:00-05:59"
    elif x < datetime.time(10):
        return "06:00-09:59"
    elif x < datetime.time(14):
        return "10:00-13:59"
    elif x < datetime.time(18):
        return "14:00-17:59"
    elif x < datetime.time(22):
        return "18:00- 21:59"
    else:
        return "22:00-23:59"
MTAdata["Time_Bin"] = MTAdata["time"].apply(time_bin)

In [54]:
time_breakdown = pd.DataFrame(MTAdata[MTAdata['STATION'].isin(top_5_list)].groupby(['STATION','Time_Bin']).sum()['traffic']).reset_index()

In [57]:
top_station_time_traffic = defaultdict(pd.DataFrame)
for station in top_5_list:
    top_station_time_traffic[station] = pd.DataFrame(MTAdata[MTAdata['STATION'] == station].groupby(['STATION', 'Time_Bin'])['traffic'].sum()).reset_index()
    top_station_time_traffic[station]['traffic'] = top_station_time_traffic[station]['traffic']/21
#    print(top_station_time_traffic[station].head())
    fig, ax = plt.subplots()
    fig.set_size_inches(10,6)
    graph = sns.barplot(x = top_station_time_traffic[station]['Time_Bin'], y = top_station_time_traffic[station]['traffic'])
    for item in graph.get_xticklabels():
        item.set_rotation(60)
    ax.set_xlabel('Time')
    ax.set_ylabel('Traffic')
    #fig.savefig("images/Peak hours for %s.png" %station)



In [58]:
top_station_turnstile_traffic = defaultdict(pd.DataFrame)

In [59]:
for station in top_5_list:
    top_station_turnstile_traffic[station] = pd.DataFrame(MTAdata[MTAdata['STATION'] == station].groupby(['turnstile'])['traffic'].sum()).reset_index()
    top_station_turnstile_traffic[station] = top_station_turnstile_traffic[station].sort_values('traffic', ascending = False).reset_index()
    top_station_turnstile_traffic[station]['traffic'] = top_station_turnstile_traffic[station]['traffic']/21
    fig, ax = plt.subplots()
    fig.set_size_inches(8,6)
    plt.tight_layout()
    graph = sns.barplot(y = top_station_turnstile_traffic[station]['turnstile'][:20], x = top_station_turnstile_traffic[station]['traffic'][:20])
    ax.set_xlabel('Traffic')
    ax.set_ylabel('Turnstiles')
    #fig.savefig("images/Highlight Turnstiles for %s.png" %station)



In [60]:
TechCompanyHeadcount = pd.read_csv('data/TechCompanyHeadcount.csv')
TechCompanyHeadcount.rename(columns=lambda x: x.strip(), inplace=True)
TechCompanyHeadcount.columns


Out[60]:
Index(['Company Name', 'NYC headcount:', '% of company based in NYC:',
       '% of engineers based in NYC:', 'Breakdown engineers vs non:'],
      dtype='object')

In [61]:
fig, ax = plt.subplots(figsize = (10, 6))
techgraph = sns.barplot(x = TechCompanyHeadcount['Company Name'][:15], y = TechCompanyHeadcount['NYC headcount:'][:15], ax=ax)
for item in techgraph.get_xticklabels():
    item.set_rotation(60)
ax.set_xlabel('Company Name');
ax.set_ylabel('NYC Headcount');
#plt.savefig('images/NYC Tech Company Headcount.png');



In [62]:
Image(filename='images/Tech Company Map/Tech Company Map.png')


Out[62]:

Demograhics

The demographic information for Time-Sq, Grand-Central, Herald-Sq and Penn-Station

Time-Sq, Grand-Central, Herald-Sq and Penn Station are all located in the same census tract. This is great news as we can aggregate demographic information for 4/5 top stations!

Below is an image of the census tract!


In [63]:
#Image('images/midtown.jpg')

Let's look at some key target demographics!


In [64]:
gender_denisty_dict = {"Female": 51.7, "Male": 48.2}

age_density_dict = {"20-24":11.5, "25-29":15.9, "30-34":11.9, "35-39": 8.6}

genderdata = pd.DataFrame.from_dict(gender_denisty_dict, orient='index')
agedata = pd.DataFrame.from_dict(age_density_dict, orient='index')

genderdata['gender'] = ['Female','Male']
agedata['age'] = ['20-24', '25-29', '30-34', '35-39']

In [65]:
fig, ax = plt.subplots(figsize = (8, 6))
sns.barplot(y = genderdata[0], x = genderdata['gender'])
ax.set_xlabel('Gender');
ax.set_ylabel('Percentage(%)');
#plt.savefig('images/Gender Breakdown Midtown.png');



In [66]:
fig, ax = plt.subplots(figsize = (10, 8))
sns.barplot(y = agedata[0], x = agedata['age'])
ax.set_xlabel('Age');
ax.set_ylabel('Percentage(%)');
#plt.savefig('images/Age Breakdown Midtown.png');



In [67]:
midtown_demo = pd.read_csv('data/midtown_agg_demo.csv')

In [68]:
del midtown_demo['Unnamed: 3']
del midtown_demo['Unnamed: 4']
midtown_demo.dropna(inplace=True)

In [69]:
midtown_demo['Percent'] = midtown_demo['Percent'].apply(lambda x: str(x))
midtown_demo['Percent'] = midtown_demo['Percent'].apply(lambda x: float(x.strip("%")))
midtown_demo


Out[69]:
Race Number Percent
0 White nonhispanic 18,351 64.1
1 Black/African American nonhispanic 1,310 4.6
2 Asian nonhispanic 5,942 20.8
3 Some other race nonhispanic 134 0.5
4 Nonhispanic of two or more races 569 2.0
5 Hispanic origin 2,324 8.1

In [70]:
fig, ax = plt.subplots(figsize = (10, 8))
sns.barplot(y = midtown_demo['Race'], x = midtown_demo['Percent'])
ax.set_ylabel('Race');
ax.set_xlabel('Percentage(%)');
#plt.savefig('images/Race Breakdown Midtown.png');



In [73]:
midtown_asian_pop = pd.read_csv('data/midtown_asian_breakdown.csv')

In [74]:
midtown_asian_pop.dropna(axis=1, inplace=True)
midtown_asian_pop.drop([0,14,15], inplace=True)

In [75]:
midtown_asian_pop = midtown_asian_pop.sort_values('Percent', ascending = False)

In [76]:
fig, ax = plt.subplots(figsize = (10, 8))
sns.barplot(y = midtown_asian_pop['SELECTED ASIAN SUBGROUPS'], x = midtown_asian_pop['Percent'])
ax.set_ylabel('Asian Sub Groups');
ax.set_xlabel('Percentage(%)');
#plt.savefig('images/Asian Sub Groups Breakdown Midtown.png');



In [77]:
midtown_hispanic_pop = pd.read_csv('data/midtown_hispanic_breakdown.csv')
midtown_hispanic_pop = midtown_hispanic_pop.sort_values('Percent', ascending = False)
midtown_hispanic_pop


Out[77]:
hispanic_subgroup Number Percent Unnamed: 3
1 Puerto Rican 606 26.1 NaN
0 Mexican 310 13.3 NaN
3 Dominican 215 9.3 NaN
2 Cuban 211 9.1 NaN
4 Central American 114 4.9 NaN

In [78]:
midtown_hispanic_pop.dropna(axis=1, inplace=True)

In [79]:
fig, ax = plt.subplots(figsize = (10, 8))
sns.barplot(y = midtown_hispanic_pop['hispanic_subgroup'], x = midtown_hispanic_pop['Percent'])
ax.set_ylabel('Hispanic Sub Groups');
ax.set_xlabel('Percentage(%)');
#plt.savefig('images/Hispanic Sub Groups Breakdown Midtown.png');



In [80]:
midtown_income = pd.read_csv('data/midtown_income.csv')
midtown_income.dropna(axis=1, inplace=True)

In [81]:
midtown_income = midtown_income.iloc[::-1]
midtown_income['INCOME AND BENEFITS'] = ['$200,000 or more', '150,000  to 199,999','100,000 to 149,999', '75,000 to 99,999', '50,000 to 74,999', '35,000 to 49,999', '25,000 to 49,999', '15,000 to 24,999', '10,000 to 14,999', 'Less than$10,000']
midtown_income


Out[81]:
INCOME AND BENEFITS Number Percentage Unnamed: 3
9 $200,000 or more 4,513 28.3 NaN
8 150,000 to 199,999 1,778 11.2 NaN
7 100,000 to 149,999 2,390 15.0 NaN
6 75,000 to 99,999 1,119 7.0 NaN
5 50,000 to 74,999 1,107 6.9 NaN
4 35,000 to 49,999 1,165 7.3 NaN
3 25,000 to 49,999 766 4.8 NaN
2 15,000 to 24,999 927 5.8 NaN
1 10,000 to 14,999 797 5.0 NaN
0 Less than$10,000 1,382 8.7 NaN

In [82]:
fig, ax = plt.subplots(figsize = (10, 8))
sns.barplot(y = midtown_income['INCOME AND BENEFITS'], x = midtown_income['Percentage'])
ax.set_ylabel('Income');
ax.set_xlabel('Percentage(%)');
#plt.savefig('images/Income Breakdown Midtown.png');



In [ ]: